#ifndef __M_ONLINE_MANAGER_HPP
#define __M_ONLINE_MANAGER_HPP

#include <iostream>
#include <unordered_map>
#include <mutex>
#include "util.hpp"

/*实现一个在线用户管理类，对于当前游戏大厅的用户与游戏房间内的用户进行管理*/
class online_manager
{
public:
    //通过websocket链接建立的时候才会进入游戏大厅，并进行游戏大厅的用户管理
    void enter_game_hall(uint64_t uid,const wsserver_t::connection_ptr& conn)
    {
        std::unique_lock<std::mutex> locK(_mutex);
        _hall_users.insert(std::make_pair(uid,conn));
    }
    //游戏房间内的用户管理
    void enter_game_room(uint64_t uid,const wsserver_t::connection_ptr& conn)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        _room_users.insert(std::make_pair(uid,conn));
    }
    //用户退出游戏大厅时，用户从游戏大厅管理中移除
    void exit_game_hall(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        if(_hall_users.find(uid)!=_hall_users.end()) _hall_users.erase(uid);
    }
    //用户退出游戏房间时，用户从游戏房间管理中移除
    void exit_game_room(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        if(_room_users.find(uid)!=_room_users.end()) _room_users.erase(uid);
    }
    //根据用户ID判断用户是否在游戏大厅
    bool is_in_game_hall(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        if(_hall_users.find(uid)==_hall_users.end()) return false;
        return true;
    }
    //根据用户ID判断用户是否在游戏房间
    bool is_in_game_room(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        if(_room_users.find(uid)==_room_users.end()) return false;
        return true;
    }
    //通过用户ID返回该用户在游戏大厅的连接
    wsserver_t::connection_ptr get_conn_from_hall(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto iter=_hall_users.find(uid);
        if(iter==_hall_users.end()) return wsserver_t::connection_ptr();
        return iter->second;
    }
    //通过用户ID返回该用户在游戏房间的连接
    wsserver_t::connection_ptr get_conn_from_room(uint64_t uid)
    {
        std::unique_lock<std::mutex> lock(_mutex);
        auto iter=_room_users.find(uid);
        if(iter==_room_users.end()) return wsserver_t::connection_ptr();
        return iter->second;
    }

private:
    std::unordered_map<uint64_t,wsserver_t::connection_ptr> _hall_users;//通过用户ID与链接建立映射关系，管理游戏大厅的用户
    std::unordered_map<uint64_t,wsserver_t::connection_ptr> _room_users;//通过用户ID与链接建立映射关系，管理房间内用户
    std::mutex _mutex;//加锁保护
};

#endif